/*
 * Indexador.cpp
 *
 *  Created on: Sep 10, 2012
 *      Author: romina
 */

#include "Indexador.h"

namespace indexador {


Indexador::Indexador(string path, string path_file_out){

	this->text_file = new ArchivoDeTexto(path, R);
	this->indexed_file_bin = new ArchivoBinario(path_file_out + ".bin", W);
	this->indexed_file_text = new ArchivoDeTexto(path_file_out + ".txt", W);
	this->random = new Random(RAND);
}

string Indexador::formatear_para_binario(string id, string linea){

	string formateada = id + linea;

	return formateada;

}

string Indexador::formatear_para_texto(string index, string linea){

	string formateada = index + "\t" + linea;

	return formateada;

}

string Indexador::generarIdAleatorio(){

	unsigned int iIndex;
	string sIndex;
	stringstream sstream;
	int cant_ceros_a_agregar = 0;
	int long_cadena = 0;
	string mod_sIndex = "";

	iIndex = this->random->get_valor();
	sIndex = Palabra::intToString(iIndex);
	long_cadena = sIndex.length();

	if (long_cadena != LONG_INDICE){
		cant_ceros_a_agregar = LONG_INDICE - long_cadena;
		for (int i=0; i < cant_ceros_a_agregar; i++){
			mod_sIndex.append("0");
		}
		mod_sIndex.append(sIndex);
	}
	else{
		mod_sIndex = sIndex;
	}

	if (! mod_sIndex.length() == LONG_INDICE)
		throw LongitudIndiceException();

	return mod_sIndex;

}

void Indexador::indexar_archivo(){

	string id;
	string linea_leida;
	while(!this->text_file->is_EOF()){
		id = generarIdAleatorio();
		linea_leida = this->text_file->obtenerLinea();

		if(!this->text_file->is_EOF()){
			this->indexed_file_bin->escribirLinea(formatear_para_binario(id, linea_leida));
			this->indexed_file_text->escribirLinea(formatear_para_texto(id, linea_leida));
		}
		else{
			this->indexed_file_bin->escribirPalabra(formatear_para_binario(id, linea_leida));
			this->indexed_file_text->escribirPalabra(formatear_para_texto(id, linea_leida));
		}

	}
}

Indexador::~Indexador() {
	delete (this->indexed_file_text);
	delete (this->indexed_file_bin);
	delete (this->random);
}

} /* namespace indexador */
